/*===============================================
 *   文件名称：serial.c
 *   创 建 者: 麦穗飘飘
 *   创建日期：2024年12月15日   15:30:58
 *   描    述：串口信息配置和读写  
 ================================================*/
#include "serial.h"

/* 打开串口 */
int serial_open(const char *port)
{
    /* O_NOCTTY：不将串口设备作为控制终端
     * O_RDWR：读写模式
     *port：8884 从Qt获取数据的串口号
     * fd：A9 Board文件描述符
     */
    int fd=open(port, O_RDWR | O_NOCTTY );
    if(fd==-1)
    {
        perror("open port");
        return -1;
    }
    return fd;

}

/* 配置串口参数 */
int serial_config(int fd)
{
    printf("Configuring serial port\n");
    struct termios options; // 串口配置参数
    if(tcgetattr(fd,&options)<0)//获取原有串口配置
    {
        perror("get serial");
        return -1;
    }

    options.c_cflag &= ~PARENB;   // 禁用奇偶校验
    options.c_iflag &= ~INPCK;    // 禁止输入奇偶校验

    options.c_cflag &= ~CRTSCTS;  // 禁用硬件流控制
    options.c_cflag |= CREAD;     // 启用接收
    options.c_cflag |= CLOCAL;    // 忽略控制线状态
    options.c_cflag &= ~CSTOPB;   // 1位停止位
    options.c_cflag &= ~CSIZE;    // 清除数据位设置
    options.c_cflag |= CS8;       // 设置数据位为8位
    //设置波特率
    cfsetispeed(&options,B115200);
    cfsetospeed(&options,B115200);

    // 禁用回显（ECHO）
    options.c_lflag &= ~ECHO; // 关闭本地回显

    tcflush(fd, TCIFLUSH);  // 清除输入缓冲区
    if(tcsetattr(fd, TCSANOW, &options)!=0)  // 应用配置
    {
        perror("set serial");
        return -1;
    }
}

/* 通过串口发送来自Qt的数据写入STM32 */
int serial_write(int fd,const char *data) 
{
    int ret=write(fd,data,strlen(data));
    if(ret<0)
    {
        perror("Write failed");
        return -1;
    }
    return ret;
}

/* 串口从STM32读取数据并写入Qt */
int serial_read_data(int fd,struct message *ptr_data)
{
    printf("ptr_data\n");
    int ret=read(fd,ptr_data,sizeof(struct message));
    if(ret<0)
    {
        perror("read");
        return -1;
    }
    return ret;
}

/* 串口从STM32读取图像并写入Qt */
int serial_read_image(int fd, char *buf){
    int ret=read(fd,buf,sizeof(buf));
    if(ret<0)
    {
        perror("read");
        return -1;
    }
    return ret;
}

/* 关闭串口 */
void serial_close(int fd)
{
    close(fd);
}

